

#ifndef __MAP_DATA_H__
#define __MAP_DATA_H__

#include <v3_msgs/MapInfo.h>
#include <geometry_msgs/Point32.h>

namespace global_path_planner {
namespace preprocess {

class MapData{
public:
    explicit MapData();
    virtual ~MapData();

    // 更新地图时清空地图相关信息
    void Reset();

    // 解析虚拟墙
    void ParseVirtualWalls(const v3_msgs::MapInfoConstPtr& msg_ptr);

    // 解析功能区
    void ParseFuncAreas(const v3_msgs::MapInfoConstPtr& msg_ptr);

    // 获取矩形功能区
    std::vector<std::pair<uint8_t, std::vector<std::pair<float, float>>>> GetRectFuncAreas() const{
        return rect_func_areas;
    }

    // 多边形功能区
    std::vector<std::pair<uint8_t, std::vector<std::pair<float, float>>>> GetPolyFuncAreas() const{
        return poly_func_areas;
    }

    // 获取圆形功能区
    std::vector<std::pair<uint8_t, std::pair<std::pair<float, float>, float>>> GetCircleFuncAreas() const{
        return circle_func_areas;
    }

    // 圆形虚拟墙
    std::vector<std::pair<std::pair<float, float>, float>> GetCircleVirtueWalls() const{
        return circle_virtue_walls;
    }

    // 线段虚拟墙
    std::vector<std::vector<std::pair<float, float>>> GetLineVirtueWalls() const{
        return line_virtue_walls;
    }

    // 矩形虚拟墙
    std::vector<std::vector<std::pair<float, float>>> GetRectVirtueWalls() const{
        return rect_virtue_walls;
    }

    // 多边形虚拟墙
    std::vector<std::vector<std::pair<float, float>>> GetPolyVirtueWalls() const{
        return poly_virtue_walls;
    }
private:
    // 解析各种形状区域
    void ParseShapeAreas(const std::string& shape, const uint8_t& type, 
                        const std::vector<geometry_msgs::Point32>& points);
    // 判断两点是否有重合
    std::vector<std::pair<float, float>> TwoPointsCoincide(const std::vector<geometry_msgs::Point32>& points);

private:
    // 矩形功能区
    std::vector<std::pair<uint8_t, std::vector<std::pair<float, float>>>> rect_func_areas;
    // 多边形功能区
    std::vector<std::pair<uint8_t, std::vector<std::pair<float, float>>>> poly_func_areas;
    // 圆形功能区
    std::vector<std::pair<uint8_t, std::pair<std::pair<float, float>, float>>> circle_func_areas;
    // 圆形虚拟墙
    std::vector<std::pair<std::pair<float, float>, float>> circle_virtue_walls;
    // 线段虚拟墙
    std::vector<std::vector<std::pair<float, float>>> line_virtue_walls;
    // 矩形虚拟墙
    std::vector<std::vector<std::pair<float, float>>> rect_virtue_walls;
    // 多边形虚拟墙
    std::vector<std::vector<std::pair<float, float>>> poly_virtue_walls;
};

}  // namespace preprocess
}  // namespace global_path_planner

#endif  // __MAP_DATA_H__